package cn.e3mall.content.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.e3mall.common.E3Result;
import cn.e3mall.common.EasyUITreeNode;
import cn.e3mall.content.service.ContentCategoryService;
import cn.e3mall.mapper.TbContentCategoryMapper;
import cn.e3mall.pojo.TbContentCategory;
import cn.e3mall.pojo.TbContentCategoryExample;
import cn.e3mall.pojo.TbContentCategoryExample.Criteria;

@Service
public class ContentCategoryServiceImpl implements ContentCategoryService {

		@Autowired
		private TbContentCategoryMapper contentCategoryMapper;
		
		@Override
		public List<EasyUITreeNode> getContentCategoryList(long parentId) {
			// 1、取查询参数id，parentId
			// 2、根据parentId查询tb_content_category，查询子节点列表。
			TbContentCategoryExample example = new TbContentCategoryExample();
			//设置查询条件
			Criteria criteria = example.createCriteria();
			criteria.andParentIdEqualTo(parentId);
			//执行查询
			// 3、得到List<TbContentCategory>
			List<TbContentCategory> list = contentCategoryMapper.selectByExample(example);
			// 4、把列表转换成List<EasyUITreeNode>ub
			List<EasyUITreeNode> resultList = new ArrayList<>();
			for (TbContentCategory tbContentCategory : list) {
				EasyUITreeNode node = new EasyUITreeNode();
				node.setId(tbContentCategory.getId());
				node.setText(tbContentCategory.getName());
				node.setState(tbContentCategory.getIsParent()?"closed":"open");
				//添加到列表
				resultList.add(node);
			}
			return resultList;
	}

		@Override
		public E3Result addContentCategory(Long parentId, String name) {
			// 1、接收两个参数：parentId、name
			// 2、向tb_content_category表中插入数据。
			// a)创建一个TbContentCategory对象
			TbContentCategory tbContentCategory = new TbContentCategory();
			// b)补全TbContentCategory对象的属性
			tbContentCategory.setIsParent(false);
			tbContentCategory.setName(name);
			tbContentCategory.setParentId(parentId);
			//排列序号，表示同级类目的展现次序，如数值相等则按名称次序排列。取值范围:大于零的整数
			tbContentCategory.setSortOrder(1);
			//状态。可选值:1(正常),2(删除)
			tbContentCategory.setStatus(1);
			tbContentCategory.setCreated(new Date());
			tbContentCategory.setUpdated(new Date());
			// c)向tb_content_category表中插入数据
			contentCategoryMapper.insert(tbContentCategory);
			// 3、判断父节点的isparent是否为true，不是true需要改为true。
			TbContentCategory parentNode = contentCategoryMapper.selectByPrimaryKey(parentId);
			if (!parentNode.getIsParent()) {
				parentNode.setIsParent(true);
				//更新父节点
				contentCategoryMapper.updateByPrimaryKey(parentNode);
			}
			// 4、需要主键返回。
			// 5、返回E3Result，其中包装TbContentCategory对象
			return E3Result.ok(tbContentCategory);
		}

		@Override
		public E3Result updateContentCategory(Long id, String name) {
			TbContentCategory tbContentCategoryEntity = contentCategoryMapper.selectByPrimaryKey(id);
			if(tbContentCategoryEntity == null) {
				return E3Result.build(500, "内容分类不存在");
			}
			tbContentCategoryEntity.setName(name);
			contentCategoryMapper.updateByPrimaryKey(tbContentCategoryEntity);
			return E3Result.ok();
		}

		@Override
		public E3Result deleteContentCategory(Long id) {
			/*1、根据id删除记录。
			2、判断父节点下是否还有子节点，如果没有需要把父节点的isparent改为false
			3、如果删除的是父节点，子节点要级联删除。
			两种解决方案：
			1）如果判断是父节点不允许删除。
			递归删除。*/
			// 1. 判断节点类型
			if(id == null) {
				return E3Result.build(500, "内容分类Id为null");
			}
			TbContentCategory tbContentCategoryEntity = contentCategoryMapper.selectByPrimaryKey(id);
			Boolean isParent = tbContentCategoryEntity.getIsParent();
			if(isParent) {
				// 1.1 父节点，级联删除
				// 1.1.2 删除子节点
				deleteContentCategoryByRecursion(id);
			}else {
				// 子节点，判断父节点下是否还有子节点，如果没有需要把父节点的isparent改为false
				// 删除当前节点 
				contentCategoryMapper.deleteByPrimaryKey(id);
				Long parentId = tbContentCategoryEntity.getParentId();
				List<TbContentCategory> tbContentCategoryList = contentCategoryMapper.selectByParentId(parentId);
				if(tbContentCategoryList == null || tbContentCategoryList.size() == 0) {
					TbContentCategory tbContentCategoryParent = contentCategoryMapper.selectByPrimaryKey(parentId);
					tbContentCategoryParent.setIsParent(Boolean.FALSE);
					
					contentCategoryMapper.updateByPrimaryKey(tbContentCategoryParent);
				}
			}
			
			// 2. 判断父节点下是否还有子节点，如果没有需要把父节点的isparent改为false
			
			return E3Result.ok();
		}

		@Override
		public void deleteContentCategoryByRecursion(Long id) {
			// 递归删除内容分类
			TbContentCategory tbContentCategoryEntity = contentCategoryMapper.selectByPrimaryKey(id);
			Boolean isParent = tbContentCategoryEntity.getIsParent();
			if(isParent) {
				// 1.1 父节点，级联删除
				// 1.1.1 删除当前节点 
				contentCategoryMapper.deleteByPrimaryKey(id);
				// 1.1.2 删除子节点
				List<TbContentCategory> tbContentCategoryList = contentCategoryMapper.selectByParentId(id);
				for (TbContentCategory tbContentCategory : tbContentCategoryList) {
					Boolean isParent2 = tbContentCategory.getIsParent();
					if(isParent2) {
						deleteContentCategoryByRecursion(tbContentCategory.getId());
					}else {
						contentCategoryMapper.deleteByPrimaryKey(tbContentCategory.getId());
					}
				}
			}else {
				contentCategoryMapper.deleteByPrimaryKey(id);
			}
		}

}
